package com.tjetc._1collection._2set;

import java.util.LinkedHashSet;

@SuppressWarnings("all")
public class _4LinkedHashSet {
    public static void main(String[] args) {
        /*
            LinkedHashSet：
            1.LinkedHashSet是HashSet的⼦类 这俩个是继承关系
            2.LinkedHashSet底层是⼀个LinkedHashMap,底层维护了⼀个数组+双向链表
            3.LinkedHashSet不允许添重复元素


            结论：
            1. 在LinkedHastSet中维护了⼀个hash表（数组）和双向链表(LinkedHashSet 有head 和 tail )
            2. 每⼀个节点有 before 和 after 属性,这样可以形成双向链表
            3. 在添加⼀个元素时，先求hash值，在求索引。确定该元素在hashtable的位置，然后将添加的
            元素加⼊到双向链表(如果已经存在，不添加（原则和hashset⼀样）)
                tail.next= newElement
                newElement.pre = tail
                tail = newEelment;
            4. 这样的话，我们遍历LinkedHashSet 也能确保插⼊顺序和遍历顺序⼀致




         */
        /*
            底层构建的是LinkedHashMap
            HashSet(int initialCapacity, float loadFactor, boolean dummy) {
                map = new LinkedHashMap<>(initialCapacity, loadFactor);
            }

            底层维护了
            transient LinkedHashMap.Entry<K,V> head;
            transient LinkedHashMap.Entry<K,V> tail;

            在底层+扩容时多了before和after的指向问题


            ----------------添加节点------------------
            1.在调用put方法时 创建节点 创建的是双向节点
            if ((p = tab[i = (n - 1) & hash]) == null) {
                tab[i] = newNode(hash, key, value, null);
            }

            2.创建节点
             Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
                LinkedHashMap.Entry<K,V> p =
                    new LinkedHashMap.Entry<>(hash, key, value, e);
                linkNodeLast(p);
                return p;
            }

            3.开始放值
            private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
                LinkedHashMap.Entry<K,V> last = tail;
                tail = p;
                if (last == null)
                    head = p;
                else {
                    p.before = last;
                    last.after = p;
                }
            }





         */




        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add(1);

    }
}
